﻿using System.Text.RegularExpressions;

namespace Kyoh.Lib.Text
{
    /// <summary>1 回のワイルドカード検索に一致した結果を表します。</summary>
    public class WildMatch
    {
        private readonly Match _match;
        internal WildMatch(Match m)
        {
            _match = m;
        }

        /// <summary>一致する対象が最後に見つかった位置 (最後に一致した文字の後ろの文字) から開始して、次に一致する対象を検索した結果の <see cref="WildMatch"/> を返します。</summary>
        /// <returns>次のワイルドカード <see cref="WildMatch"/> オブジェクト。</returns>
        public WildMatch NextMatch()
        {
            return new WildMatch(_match.NextMatch());
        }

        /// <summary>指定された置換パターンを展開して返します。</summary>
        /// <param name="replacement">使用する置換パターン。</param>
        /// <exception cref="System.ArgumentNullException"><paramref name="replacement"/> が <c>null</c> です。</exception>
        /// <exception cref="System.NotSupportedException">このパターンは展開できません。</exception>
        /// <returns><paramref name="replacement"/> パラメータの展開形式。</returns>
        public virtual string Result(string replacement)
        {
            return _match.Result(replacement);
        }

        /// <summary>指定されたオブジェクトと等価であり、かつ複数のスレッド間での共有に適した <see cref="WildMatch"/> インスタンスを返します。</summary>
        /// <param name="inner">返されるインスタンスと等価の <see cref="WildMatch"/> インスタンス。</param>
        /// <exception cref="System.ArgumentNullException"><paramref name="inner"/> が <c>null</c> です。</exception>
        /// <returns>指定されたオブジェクトと等価であり、かつ複数のスレッド間での共有に適した <see cref="WildMatch"/> インスタンス。</returns>
        public static WildMatch Synchronized(WildMatch inner)
        {
            return new WildMatch(Match.Synchronized(inner._match));
        }

        /// <summary>
        /// 内側と左側が先の順序で、キャプチャ グループに一致したすべてのキャプチャ結果のコレクションを取得します。
        /// または、ワイルドカードが <see cref="System.Text.RegularExpressions.RegexOptions.RightToLeft"/> オプションを使用して変更されている場合は、
        /// 内側と右端が先の順序で取得します。このコレクションには <c>0</c> 個以上の項目が格納されています。
        /// </summary>
        /// <returns>グループに一致した部分文字列のコレクション。</returns>
        public CaptureCollection Captures
        {
            get { return _match.Captures; }
        }

        /// <summary>一致した対象が見つかったかどうかを示す値を取得します。</summary>
        /// <returns>一致した対象が見つかった場合は <c>true</c>。それ以外の場合は <c>false</c>。</returns>
        public bool Success
        {
            get { return _match.Success; }
        }

        /// <summary>キャプチャした部分文字列の最初の文字が見つかった元の文字列内の位置。</summary>
        /// <returns>キャプチャした部分文字列が見つかった元の文字列内の開始位置を示す <c>0</c> から始まる数値。</returns>
        public int Index
        {
            get { return _match.Index; }
        }

        /// <summary>キャプチャした部分文字列の長さ。</summary>
        /// <returns>キャプチャした部分文字列の長さ。</returns>
        public int Length
        {
            get { return _match.Length; }
        }

        /// <summary>入力文字列からキャプチャした部分文字列を取得します。</summary>
        /// <returns>検索によってキャプチャされた実際の部分文字列。</returns>
        public string Value
        {
            get { return _match.Value; }
        }

        /// <summary>入力文字列からキャプチャした部分文字列を取得します。</summary>
        /// <returns>検索によってキャプチャされた実際の部分文字列。</returns>
        public override string ToString()
        {
            return _match.ToString();
        }
    }
}
